#include "ClaveIntChar.h"

#include "string"
using namespace std;

ClaveIntChar::ClaveIntChar(int entero, char letra) {
	this->entero = entero;
	this->letra = letra;
}

ClaveIntChar::ClaveIntChar(const Bytes& clave) {
	this->hidratarse(clave);
}

ClaveIntChar::~ClaveIntChar() {

}

bool ClaveIntChar::operator==(const DatoClave& otro)const {

	const ClaveIntChar *clave = dynamic_cast<const ClaveIntChar*>(&otro);

	return (this->entero == clave->entero && this->letra == clave->letra);
}

bool ClaveIntChar::operator<(const DatoClave& otro)const {

	const ClaveIntChar *clave = dynamic_cast<const ClaveIntChar*>(&otro);

	if (this->entero == clave->entero) {
		return this->letra < clave->letra;
	}

	return this->entero < clave->entero;
}

bool ClaveIntChar::operator>(const DatoClave& otro)const {

	const ClaveIntChar *clave = dynamic_cast<const ClaveIntChar*>(&otro);

	if (this->entero == clave->entero) {
		return this->letra > clave->letra;
	}

	return this->entero > clave->entero;
}

bool ClaveIntChar::operator<=(const DatoClave& otro)const {

	const ClaveIntChar *clave = dynamic_cast<const ClaveIntChar*>(&otro);

	if (this->entero == clave->entero) {
		return this->letra <= clave->letra;
	}

	return this->entero <= clave->entero;
}

Bytes ClaveIntChar::serializarse() {

	Bytes serializacion;
	serializacion.agregarAlFinal(&entero,sizeof(int));
	serializacion.agregarAlFinal(&letra,sizeof(char));
	return serializacion;
}

bool ClaveIntChar::hidratarse(const Bytes& serializacion) {

	offset offset = 0;
	serializacion.leer(&entero,offset,sizeof(int));
	offset += sizeof(int);
	serializacion.leer(&letra,offset,sizeof(char));
	return true;
}

string ClaveIntChar::toString() const {
	string retorno = "[";

	std::stringstream o;
	o<<entero;
	retorno += o.str();

	retorno += ",";
	retorno += letra;
	retorno += "]";

	return retorno;
}

DatoClave* ClaveIntChar::getCopia() {
	return new ClaveIntChar(entero, letra);
}
